home *** CD-ROM | disk | FTP | other *** search
- head 1.2;
- branch ;
- access ;
- symbols ;
- locks ; strict;
- comment @ * @;
-
-
- 1.2
- date 89.05.18.17.11.57; author rab; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 88.07.02.16.49.40; author ouster; state Exp;
- branches ;
- next ;
-
-
- desc
- @@
-
-
- 1.2
- log
- @Added forward declarations for static functions.
- @
- text
- @/*
- * Copyright (c) 1987 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at Berkeley. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific written prior permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
- #if defined(LIBC_SCCS) && !defined(lint)
- static char sccsid[] = "@@(#)mktemp.c 5.6 (Berkeley) 5/23/88";
- #endif /* LIBC_SCCS and not lint */
-
- #include <sys/types.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <stdio.h>
- #include <ctype.h>
-
- #define YES 1
- #define NO 0
-
- static int _gettemp();
-
- int
- mkstemp(as)
- char *as;
- {
- int fd;
-
- return (_gettemp(as, &fd) ? fd : -1);
- }
-
- char *
- mktemp(as)
- char *as;
- {
- return(_gettemp(as, (int *)NULL) ? as : (char *)NULL);
- }
-
- static int
- _gettemp(as, doopen)
- char *as;
- register int *doopen;
- {
- extern int errno;
- register char *start, *trv;
- struct stat sbuf;
- u_int pid;
-
- pid = getpid();
-
- /* extra X's get set to 0's */
- for (trv = as; *trv; ++trv);
- while (*--trv == 'X') {
- *trv = (pid % 10) + '0';
- pid /= 10;
- }
-
- /*
- * check for write permission on target directory; if you have
- * six X's and you can't write the directory, this will run for
- * a *very* long time.
- */
- for (start = ++trv; trv > as && *trv != '/'; --trv);
- if (*trv == '/') {
- *trv = '\0';
- if (stat(as, &sbuf) || !(sbuf.st_mode & S_IFDIR))
- return(NO);
- *trv = '/';
- }
- else if (stat(".", &sbuf) == -1)
- return(NO);
-
- for (;;) {
- if (doopen) {
- if ((*doopen = open(as, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
- return(YES);
- if (errno != EEXIST)
- return(NO);
- }
- else if (stat(as, &sbuf))
- return(errno == ENOENT ? YES : NO);
-
- /* tricky little algorithm for backward compatibility */
- for (trv = start;;) {
- if (!*trv)
- return(NO);
- if (*trv == 'z')
- *trv++ = 'a';
- else {
- if (isdigit(*trv))
- *trv = 'a';
- else
- ++*trv;
- break;
- }
- }
- }
- /*NOTREACHED*/
- }
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d27 3
- d45 1
- a45 1
- static
- @
-